#include <asm/mtrr.h>
#include "cpu/mtrr/mtrr.h"
+extern uint16_t boot_edid_caps;
+extern uint8_t boot_edid_info[];
+
#ifndef COMPAT
typedef long ret_t;
DEFINE_SPINLOCK(xenpf_lock);
? -EFAULT : 0);
break;
}
+ case XEN_FW_VBEDDC_INFO:
+ ret = -ESRCH;
+ if ( op->u.firmware_info.index != 0 )
+ break;
+ if ( *(u32 *)bootsym(boot_edid_info) == 0x13131313 )
+ break;
+
+ op->u.firmware_info.u.ddc_info.capabilities =
+ bootsym(boot_edid_caps);
+ op->u.firmware_info.u.ddc_info.edid_transfer_time =
+ bootsym(boot_edid_caps) >> 8;
+
+ ret = 0;
+ if ( copy_field_to_guest(u_xenpf_op, op, u.firmware_info.
+ u.ddc_info.capabilities) ||
+ copy_field_to_guest(u_xenpf_op, op, u.firmware_info.
+ u.ddc_info.edid_transfer_time) ||
+ copy_to_compat(op->u.firmware_info.u.ddc_info.edid,
+ bootsym(boot_edid_info), 128) )
+ ret = -EFAULT;
+ break;
default:
ret = -EINVAL;
break;
DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t);
#define XENPF_firmware_info 50
-#define XEN_FW_DISK_INFO 1
-#define XEN_FW_DISK_MBR_SIGNATURE 2
+#define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */
+#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */
+#define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */
struct xenpf_firmware_info {
/* IN variables. */
uint32_t type;
uint8_t device; /* bios device number */
uint32_t mbr_signature; /* offset 0x1b8 in mbr */
} disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */
+ struct {
+ /* Int10, AX=4F15: Get EDID info. */
+ uint8_t capabilities;
+ uint8_t edid_transfer_time;
+ /* must refer to 128-byte buffer */
+ XEN_GUEST_HANDLE(uint8_t) edid;
+ } ddc_info; /* XEN_FW_VBEDDC_INFO */
} u;
};
typedef struct xenpf_firmware_info xenpf_firmware_info_t;